#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <QObject>
#include <QSerialPort>
#include <QQueue>
#include <QTimer>
#include <functional>

class SerialPort : public QObject
{
    Q_OBJECT

public:
    explicit SerialPort(const QString &portName, const QString &portNum, QObject *parent = nullptr, int timeout = 3000);
    ~SerialPort();
    
    // 发送数据并指定解析函数
    void sendData(const QByteArray &data, std::function<void(const QByteArray&)> parser = nullptr);
    // 发送数据并指定解析函数（QString版本）
    void sendStringData(const QString &data, std::function<void(const QByteArray&)> parser = nullptr);
    // 设置超时时间
    void setTimeout(int timeout);

    // 打开串口
    bool openPort(const QString &portName);

    // 关闭串口
    void closePort();

    // 检查连接状态，是否超时
    bool checkConnectState();

    // 获取串口连接状态
    bool connectStatus() const;
    void setConnectStatus(bool connectStatus);

    void configurePort(QSerialPort::BaudRate baudRate, QSerialPort::DataBits dataBits, QSerialPort::Parity parity, QSerialPort::StopBits stopBits, QSerialPort::FlowControl flowControl);
signals:
    // 响应超时信号
    void responseTimeout(const QByteArray &data);
    // 接收到数据信号
    void dataReceived(const QByteArray &data);

private slots:
    // 串口准备读取数据槽函数
    void onReadyRead();
    // 超时处理槽函数
    void onTimeout();

private:
    // 处理下一帧数据
    void processNext();

private:
    struct DataFrame {
        QByteArray data;
        std::function<void(const QByteArray&)> parser;
    };

    QSerialPort *m_serial = nullptr;               // 串口对象
    QQueue<DataFrame> m_sendQueue;       // 发送队列
    QTimer *m_timeoutTimer = nullptr;              // 超时定时器
    int m_timeout;                       // 超时时间
    DataFrame m_currentFrame;            // 当前发送的数据帧

    bool m_openFlag;    // 串口打开标志位

    bool m_connectStatus = false; // 端口连接状态位

    bool m_isConfigured = false;  // 标记串口参数已配置

    QString m_portName; // 端口名称
    QString m_devName;  // 设备名称
};

#endif // SERIALPORT_H
